//
//  MDDeviceManager.h
//  MideaHomeSDK
//
//  Created by 刘 子威 on 15/4/6.
//  Copyright (c) 2015年 Midea. All rights reserved.
//
//  该类为设备管理类，包括了用户Token获取、设备识别、设备配网及用户设备绑定等功能
//

#import <Foundation/Foundation.h>

typedef void (^successBlock)(NSDictionary * dic);
typedef void (^failBlock)(NSError *error);
typedef void (^successArrayBlock)(NSArray *array);

typedef NS_ENUM(NSInteger, MDWifiSecurity)
{
    MDWifiSecurityNone = 0,
    MDWifiSecurityWEP  = 1,
    MDWifiSecurityWPA  = 2
};

// 错误码定义
typedef enum {
    ERROR_WIFI_DISABLED = 4001,               // 未打开Wifi
    ERROR_QRCODE_INVALID = 4002,              // 二维码错误
    ERROR_ACCESSTOKEN_NOT_EXISTS = 4003,      // 找不到accessToken
    ERROR_CONNECT_DEVICE_TIMEOUT = 4004,      // 连接设备超时
    ERROR_FIND_APLIST_TIMEOUT = 4005,         // 搜索周围AP超时
    ERROR_SSID_PASSWORD_SEND = 4010,          // SSID和密码发送失败
    ERROR_NETWORK_NOT_CHANGE = 4011,          // 网络未切换
    ERROR_CHECK_SERVER_FAILED = 4012,         // 该网络无法连接到服务器
    ERROR_BIND_FAILED_CHECK_WIFI = 4018,      // 绑定失败，请检查wifi模块
    ERROR_BIND_PARAMS_INVALID = 4019,         // 绑定参数无效
    ERROR_BIND_TO_SERVER_FAILED = 4020,       // 绑定到服务器失败
    ERROR_CONFIGURE_FAILED = 4025,            // 配置家电失败
    ERROR_GET_MODEL_FROM_QRCODE = 3165,       // 从二维码中获取model失败
} MideaSDKError;

@interface MDDeviceManager : NSObject

#pragma mark - init
/**
 *  初始化方法
 *
 *  appId、appKey、src: 由美的分配给第三方APP的身份标识及密钥
 *  isRelease: YES为生产  NO为测试，美的给第三方APP两套平台，生产和测试平台
 *             我们建议开发联调阶段配置SDK为测试，到正式部署时配置为生产
 */
- (id)initWithAppId:(NSString *)appId
             appKey:(NSString *)appKey
                src:(NSString *)src
          isRelease:(BOOL)isRelease;

#pragma mark - token
/**
 *  获取第三方用户在美的平台的token
 *
 *  thirdUId:      第三方平台的用户ID，用来唯一标识该平台上的用户
 *  successBlock:  获取token成功时的回调，回调结果为NSDictionary，该字典存储了json数据，如：
 *                 {result:{accessToken: "122-32333-avgt-dd"}}
 *  failBlock:     获取token失败时的回调，回调结果为NSError。其中部分的error.code对应于本文件
 *                 上的错误码定义
 */
- (void)getAccessToken:(NSString *)thirdUId
               success:(successBlock)successBlock
                  fail:(failBlock)failBlock;


/**
 *  accessToken解密
 */
- (NSString *)decodeAccessToken:(NSString *)accessToken;


#pragma mark - qrcode
/**
 *  检查二维码是否合法
 *  qrcode为扫描出来的二维码串
 *  返回检查结果，布尔值
 */
- (BOOL)isQRCodeValid:(NSString *)qrcode;

/**
 *  从二维码获取目标设备SSID
 *  qrcode为扫描出来的二维码串
 *  返回SSID
 */
- (NSString *)getSSIDfromQRCode:(NSString *)qrcode;

/**
 *  从二维码获取目标设备SN
 *  qrcode为扫描出来的二维码串
 *  返回SN
 */
- (NSString *)getSNfromQRCode:(NSString *)qrcode;


/**
 *  获取用户当前连接的SSID
 */
- (NSString *)getCurrentSSID;

/**
 *  获取设备MODEL
 *  successBlock返回字典{“errorCode”:”0”,“result”:{“model”:”0000.E2.2”}}
 */
- (void)getModelFromQrcode:(NSString *)qrcode
               accessToken:(NSString *)accessToken
                   success:(successBlock)successBlock
                      fail:(failBlock)failBlock;

/**
 *  wifi密码长度是否合法
 *  password是wifi密码
 *  security见本头文件宏定义NONE、WEP、WPA
 *  返回SN
 */
- (BOOL)isValidWifiPassword:(NSString *)password security:(MDWifiSecurity)security;

#pragma mark - device
/**
 *  判断设备是否已进入配置模式
 */
- (BOOL)isDeviceReady;

/**
 *  连接设备，10秒超时失败
 */
-(void)connectDevice:(NSString *)ssid
             success:(successBlock)successBlock
                fail:(failBlock)failBlock;

/**
 *  搜索家庭AP列表，10秒超时失败
 */
-(void)findWifiApList:(successArrayBlock)successArrayBlock
                 fail:(failBlock)failBlock;

/**
 *  绑定设备(第三方电商用户)
 *  homeSSID: 家庭wifi的热点名称
 *  password: 家庭wifi的密码
 *  security: 家庭wifi加密方式 0=OPEN  1=WEP  2=WPA
 *  accessToken: 从getAccessToken函数中获取
 *  qrcodeSN: 从getSNfromQRCode函数中获取
 *  deviceName: 用户自定义的设备命名
 *  success: 回调返回 NSDictionary {result:{virtualId:"17938288333", deviceModel:"0000.AC.2"}
 *  fail: 回调失败 NSError， 90秒超时失败
 */
- (void)bindDevice:(NSString *)homeSSID
          password:(NSString *)password
          security:(MDWifiSecurity)security
       accessToken:(NSString *)accessToken
          qrcodeSN:(NSString *)qrcodeSN
        deviceName:(NSString *)deviceName
           success:(successBlock)successBlock
              fail:(failBlock)failBlock;


/**
 *  绑定设备(海外用户)
 *  homeSSID: 家庭wifi的热点名称
 *  password: 家庭wifi的密码
 *  security: 家庭wifi加密方式 0=OPEN  1=WEP  2=WPA
 *  accessToken: 登陆后获取的accessToken
 *  sessionId: 登陆后获取的会话ID
 *  homegroupId: 家庭ID
 *  qrcodeSN: 从getSNfromQRCode函数中获取
 *  deviceName: 用户自定义的设备命名
 *  success: 回调返回 NSDictionary {"result":{"id":"17938288333"}}
 *  fail: 回调失败 NSError， 90秒超时失败
 */
- (void)bindDevice:(NSString *)homeSSID
          password:(NSString *)password
          security:(MDWifiSecurity)security
       accessToken:(NSString *)accessToken
         sessionId:(NSString *)sessionId
       homegroupId:(NSString *)homegroupId
          qrcodeSN:(NSString *)qrcodeSN
        deviceName:(NSString *)deviceName
           success:(successBlock)successBlock
              fail:(failBlock)failBlock;



@end
